/**
 * Author : Jorge Mejuto Create : 29/04/2010
 */

// Para comprobar el gráfico por pantalla
//
// ChartFrame frame = new ChartFrame("First", chart);
// frame.pack();
// frame.setVisible(true);
//
// Para grabarlo en disco
// try {
// ChartUtilities.saveChartAsJPEG(new File(pathAplicacion + System.getProperty("file.separator") + "produccion_acumulada_mensual.jpg"),
// chart, 800, 600);
// } catch (IOException e) {
// System.err.println("Problema ocurrido creando el chart.");
// }
//
// Para grabar en Excel (no se ve el gráfico
// HSSFWorkbook wb = new HSSFWorkbook(); // or new HSSFWorkbook();
// wb.addPicture(ChartUtilities.encodeAsPNG(imagen), HSSFWorkbook.PICTURE_TYPE_PNG);
// // save workbook
// String file = "/home/jorge/Desarrollo/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp3/wtpwebapps/eyra_3.1/temp/picture.xls";
// FileOutputStream fileOut = new FileOutputStream(file);
// wb.write(fileOut);
// fileOut.close();

package net.eyra.negocio.explotacion.informes.diario.pagina1;

import java.io.IOException;
import java.net.MalformedURLException;
import java.text.ParseException;
import java.util.List;
import java.util.TreeMap;

import net.eyra.negocio.dao.ExplotacionDao;
import net.eyra.negocio.dao.EyraDaoException;
import net.eyra.negocio.entidades.explotacion.Division;
import net.eyra.negocio.entidades.explotacion.Lectura;
import net.eyra.negocio.entidades.explotacion.Parque;
import net.eyra.negocio.entidades.explotacion.PrevisionProduccion;
import net.eyra.negocio.explotacion.informes.RD.RD;
import net.eyra.negocio.explotacion.informes.RD.RDFactory;
import net.eyra.negocio.explotacion.informes.diario.DatosExternos.DatosMeteored;
import net.eyra.negocio.explotacion.informes.diario.DatosExternos.DatosOMEL;
import net.eyra.utiles.FormateoFechaException;
import net.eyra.utiles.Numeros;
import net.eyra.utiles.PString;
import net.eyra.utiles.Periodo;

import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;

import com.itextpdf.text.BadElementException;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Font.FontFamily;
import com.itextpdf.text.Image;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;

public class Pagina1 {

    private final ExplotacionDao e_dao = new ExplotacionDao();
    private List<Parque> parques = null;
    private TreeMap<String, Double> precio_mercado = null;
    // private List<Zona> zonas = null;
    private List<Division> divisiones = null;

    public Pagina1(Document informe, Periodo periodo) throws ParseException {
        try {
            int dia = periodo.getDatoFecha(Periodo.FECHA_FINAL, Periodo.DIA);
            int mes = periodo.getDatoFecha(Periodo.FECHA_INICIAL, Periodo.MES) + 1;
            int año = periodo.getDatoFecha(Periodo.FECHA_INICIAL, Periodo.AÑO);
            CargarDatos(dia, mes, año);

            Paragraph separador = new Paragraph();
            informe.add(new Phrase(""));
            separador.setSpacingAfter(150);
            informe.add(separador);
            Paragraph titulo = new Paragraph("RESUMEN DIARIO DE PRODUCCIÓN DE EYRA", new Font(FontFamily.HELVETICA, 30, Font.BOLD));
            titulo.setAlignment(Element.ALIGN_CENTER);
            informe.add(titulo);
            separador.setSpacingAfter(50);
            informe.add(separador);

            Image imagen = null;
            //
            // imagen = new DatosOMEL().CargarImagenPrecioMedioMercadoDiario(mes, año);
            // imagen.setAlignment(Element.ALIGN_CENTER);
            // imagen.scaleAbsolute(750, 500);
            // informe.add(imagen);
            //
            // informe.newPage();

            try {
                imagen = new DatosMeteored().CargarImagenPronostico();
                imagen.setAlignment(Element.ALIGN_CENTER);
                imagen.scaleAbsolute(712, 500);
                informe.add(imagen);
            } catch (IOException e) {
                e.printStackTrace();
            }

            separador.setSpacingAfter(100);

            imagen = new DatosOMEL().CrearImagenPrecioMedioMercadoDiario(precio_mercado);
            imagen.setAlignment(Element.ALIGN_CENTER);
            imagen.scaleAbsolute(800, 500);
            informe.add(imagen);

            // try {
            // imagen = new DatosMeteored().CargarImagenIsobaras();
            // imagen.setAlignment(Element.ALIGN_CENTER);
            // imagen.scaleAbsolute(800, 662);
            // informe.add(imagen);
            // } catch (IOException e) {
            // e.printStackTrace();
            // }
            informe.newPage();

            // for (Zona zona : zonas) {
            for (Division division : divisiones) {
                // CargarParquesZona(zona.getId_zona());
                if (division.getId_division() > 0) {
                    CargarParquesDivision(division.getId_division());

                    if (parques.size() > 0) {
                        separador.setSpacingAfter(5);
                        informe.add(TablaProduccionAcumulada(periodo));
                        informe.add(separador);
                        informe.add(GraficaProduccionAcumulada(periodo));
                        informe.add(separador);
                        informe.add(GraficaProduccionIncrementalMensual(periodo));
                        informe.add(separador);
                        informe.add(GraficaProduccionMensual(periodo));
                        informe.add(separador);
                        informe.add(GraficaProduccionMensual2(periodo));
                        informe.newPage();
                        informe.add(GraficaProduccionDiariaPrecioMedio(periodo));
                        informe.add(separador);
                        informe.add(separador);
                        informe.add(GraficaFacturacionDiariaPrecioMedio(periodo));
                        informe.newPage();
                    }
                }
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * 
     * @param mes
     *            1:Enero, 2:Febrero, ....
     * @param año
     */
    private void CargarDatos(int dia, int mes, int año) {
        try {
            // zonas = e_dao.ListaZonas();
            divisiones = e_dao.ListaDivisiones();
            precio_mercado = new DatosOMEL().CargarPrecioMedioDiario(dia, mes, año);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (EyraDaoException e) {
            e.printStackTrace();
        }
    }

    // private void CargarParquesZona(int zona) {
    // try {
    // parques = e_dao.ListaParquesZona(ExplotacionDao.TIPO_TARIFICADOR_PRIMARIO, true, zona);
    // } catch (EyraDaoException e) {
    // e.printStackTrace();
    // }
    // }

    private void CargarParquesDivision(int division) {
        try {
            parques = e_dao.ListaParquesDivision(ExplotacionDao.TIPO_TARIFICADOR_PRIMARIO, true, division);
        } catch (EyraDaoException e) {
            e.printStackTrace();
        }
    }

    private double CargarPrevision(List<PrevisionProduccion> previsiones, Periodo periodo) {
        for (PrevisionProduccion prevision : previsiones)
            if (prevision.getAño() == periodo.getDatoFecha(Periodo.FECHA_INICIAL, Periodo.AÑO)
                    && prevision.getMes() == periodo.getDatoFecha(Periodo.FECHA_INICIAL, Periodo.MES) + 1) return prevision.getPrevision();
        return 0;
    }

    private double CargarPrevisionAño(List<PrevisionProduccion> previsiones, int año) {
        double suma = 0;
        for (PrevisionProduccion prevision : previsiones)
            if (prevision.getAño() == año) suma += prevision.getPrevision();
        return suma;
    }

    private Element GraficaProduccionAcumulada(Periodo periodo) throws BadElementException, MalformedURLException, IOException {
        TreeMap<String, Double> valores = new TreeMap<String, Double>();
        JFreeChart chart = null;

        try {

            for (Parque parque : parques) {
                Lectura lectura = e_dao.TotalProduccionPeriodo(parque.getTarificadores().get(0).getId_tarificador(), periodo);
                valores.put(parque.getNombre(), new Double(lectura.getActiva_exportada()));
            }

            // chart = new GraficosProduccion().GraficoProduccionAcumuladaMensual(valores, parques.get(0).getZona().getNombre());
            chart = new GraficosProduccion().GraficoProduccionAcumuladaMensual(valores, parques.get(0).getDivision().getNombre());

        } catch (EyraDaoException e) {
            System.out.println(e.getMessage());
        } catch (FormateoFechaException e) {
            System.out.println(e.getMessage());
        }

        // Image imagen = Image.getInstance(ChartUtilities.encodeAsPNG(chart.createBufferedImage(585, 350)));
        Image imagen = Image.getInstance(ChartUtilities.encodeAsPNG(chart.createBufferedImage(750, 400)));
        imagen.setAlignment(Element.ALIGN_CENTER);
        return imagen;
    }

    private Element GraficaProduccionIncrementalMensual(Periodo periodo) throws BadElementException, MalformedURLException, IOException {
        TreeMap<String, List<Lectura>> valores = new TreeMap<String, List<Lectura>>();
        JFreeChart chart = null;

        try {

            for (Parque parque : parques) {
                List<Lectura> lecturas = e_dao.RecuperarLecturasPorDia(parque.getTarificadores().get(0).getId_tarificador(), periodo, true);
                valores.put(parque.getNombre(), lecturas);
            }

            // chart = new GraficosProduccion().GraficoProduccionIncrementalAcumuladaMensual(valores, parques.get(0).getZona().getNombre());
            chart = new GraficosProduccion().GraficoProduccionIncrementalAcumuladaMensual(valores, parques.get(0).getDivision().getNombre());

        } catch (EyraDaoException e) {
            System.out.println(e.getMessage());
        } catch (FormateoFechaException e) {
            System.out.println(e.getMessage());
        }

        Image imagen = Image.getInstance(ChartUtilities.encodeAsPNG(chart.createBufferedImage(750, 500)));
        imagen.setAlignment(Element.ALIGN_CENTER);
        return imagen;
    }

    private Element GraficaProduccionDiariaPrecioMedio(Periodo periodo) throws BadElementException, MalformedURLException, IOException {
        TreeMap<String, List<Lectura>> valores = new TreeMap<String, List<Lectura>>();
        JFreeChart chart = null;

        try {

            for (Parque parque : parques) {
                List<Lectura> lecturas = e_dao.RecuperarLecturasPorDia(parque.getTarificadores().get(0).getId_tarificador(), periodo, true);
                valores.put(parque.getNombre(), lecturas);
            }

            // chart = new GraficosProduccion().GraficoProduccionDiariaPrecioMediol(valores, parques.get(0).getZona().getNombre(), precio_mercado);
            chart = new GraficosProduccion().GraficoProduccionDiariaPrecioMediol(valores, parques.get(0).getDivision().getNombre(), precio_mercado);

        } catch (EyraDaoException e) {
            System.out.println(e.getMessage());
        } catch (FormateoFechaException e) {
            System.out.println(e.getMessage());
        }

        Image imagen = Image.getInstance(ChartUtilities.encodeAsPNG(chart.createBufferedImage(750, 500)));
        imagen.setAlignment(Element.ALIGN_CENTER);
        return imagen;
    }

    private Element GraficaFacturacionDiariaPrecioMedio(Periodo periodo) throws BadElementException, MalformedURLException, IOException {
        TreeMap<String, List<Lectura>> valores = new TreeMap<String, List<Lectura>>();
        JFreeChart chart = null;

        try {

            for (Parque parque : parques) {
                RD rd = RDFactory.CargarRD(parque.getReal_decreto());
                List<Lectura> lecturas = e_dao.RecuperarLecturasPorDia(parque.getTarificadores().get(0).getId_tarificador(), periodo, true);
                double precio_medio = 0;
                if (rd != null) precio_medio = rd.CalculoPrecioMedio(precio_mercado, parque.getComplemento_reactiva());
                for (Lectura lectura : lecturas)
                    lectura.setActiva_exportada((lectura.getActiva_exportada() / 1000) * precio_medio);
                valores.put(parque.getNombre(), lecturas);
            }

            // chart = new GraficosProduccion().GraficoFacturacionDiariaPrecioMediol(valores, parques.get(0).getZona().getNombre(), precio_mercado);
            chart = new GraficosProduccion().GraficoFacturacionDiariaPrecioMediol(valores, parques.get(0).getDivision().getNombre(), precio_mercado);

        } catch (EyraDaoException e) {
            System.out.println(e.getMessage());
        } catch (FormateoFechaException e) {
            System.out.println(e.getMessage());
        }

        Image imagen = Image.getInstance(ChartUtilities.encodeAsPNG(chart.createBufferedImage(750, 500)));
        imagen.setAlignment(Element.ALIGN_CENTER);
        return imagen;
    }

    private Element GraficaProduccionMensual(Periodo periodo) throws BadElementException, MalformedURLException, IOException {
        TreeMap<String, List<Lectura>> valores = new TreeMap<String, List<Lectura>>();
        JFreeChart chart = null;

        try {

            for (Parque parque : parques) {
                List<Lectura> lecturas = e_dao.RecuperarLecturasPorDia(parque.getTarificadores().get(0).getId_tarificador(), periodo, true);
                valores.put(parque.getNombre(), lecturas);
            }

            // chart = new GraficosProduccion().GraficoProduccionDiariaAcumuladaMensual(valores, parques.get(0).getZona().getNombre());
            chart = new GraficosProduccion().GraficoProduccionDiariaAcumuladaMensual(valores, parques.get(0).getDivision().getNombre());

        } catch (EyraDaoException e) {
            System.out.println(e.getMessage());
        } catch (FormateoFechaException e) {
            System.out.println(e.getMessage());
        }

        Image imagen = Image.getInstance(ChartUtilities.encodeAsPNG(chart.createBufferedImage(750, 500)));
        imagen.setAlignment(Element.ALIGN_CENTER);
        return imagen;
    }

    private Element GraficaProduccionMensual2(Periodo periodo) throws BadElementException, MalformedURLException, IOException {
        TreeMap<String, List<Lectura>> valores = new TreeMap<String, List<Lectura>>();
        JFreeChart chart = null;

        try {

            for (Parque parque : parques) {
                List<Lectura> lecturas = e_dao.RecuperarLecturasPorDia(parque.getTarificadores().get(0).getId_tarificador(), periodo, true);
                valores.put(parque.getNombre(), lecturas);
            }

            // chart = new GraficosProduccion().GraficoProduccionDiariaAcumuladaMensual2(valores, parques.get(0).getZona().getNombre());
            chart = new GraficosProduccion().GraficoProduccionDiariaAcumuladaMensual2(valores, parques.get(0).getDivision().getNombre());

        } catch (EyraDaoException e) {
            System.out.println(e.getMessage());
        } catch (FormateoFechaException e) {
            System.out.println(e.getMessage());
        }

        Image imagen = Image.getInstance(ChartUtilities.encodeAsPNG(chart.createBufferedImage(750, 500)));
        imagen.setAlignment(Element.ALIGN_CENTER);
        return imagen;
    }

    private Element TablaProduccionAcumulada(Periodo periodo) throws DocumentException {
        float[] widths = { 25, 10, 40, 15, 10 };
        PdfPTable tabla = new PdfPTable(5);

        try {

            // String zona = parques.get(0).getZona().getNombre();
            String division = parques.get(0).getDivision().getNombre();
            tabla.setWidthPercentage(100);
            tabla.setWidths(widths);

            // PdfPCell titulo_tabla = new PdfPCell(new Phrase("PRODUCCIÓN " + zona + " ("
            PdfPCell titulo_tabla = new PdfPCell(new Phrase("PRODUCCIÓN " + division + " ("
                    + periodo.getFechaFormateada(Periodo.FORMATO_FECHA_DD_MM_AAAA, Periodo.FECHA_INICIAL, Periodo.SEPARADOR_FECHA_GUION) + " al "
                    + periodo.getFechaFormateada(Periodo.FORMATO_FECHA_DD_MM_AAAA, Periodo.FECHA_FINAL, Periodo.SEPARADOR_FECHA_GUION) + ")",
                    new Font(FontFamily.TIMES_ROMAN, 14, Font.BOLD)));
            titulo_tabla.setColspan(5);
            titulo_tabla.setHorizontalAlignment(Element.ALIGN_CENTER);
            tabla.addCell(titulo_tabla);

            // Cabeceras
            PdfPCell celda = new PdfPCell(new Phrase("INSTALACIÓN", new Font(FontFamily.TIMES_ROMAN, 10, Font.BOLD)));
            celda.setVerticalAlignment(Element.ALIGN_MIDDLE);
            tabla.addCell(celda);
            celda.setVerticalAlignment(Element.ALIGN_MIDDLE);
            celda.setHorizontalAlignment(Element.ALIGN_CENTER);
            celda.setPhrase(new Phrase("Pot. Autorizada. (kW)", new Font(FontFamily.TIMES_ROMAN, 10, Font.BOLD)));
            tabla.addCell(celda);

            PdfPTable subtablaproduccion = new PdfPTable(4);
            PdfPCell titulo_celda_produccion = new PdfPCell(new Phrase("PRODUCCIÓN", new Font(FontFamily.TIMES_ROMAN, 12, Font.BOLD)));

            titulo_celda_produccion.setColspan(4);
            titulo_celda_produccion.setVerticalAlignment(Element.ALIGN_MIDDLE);
            titulo_celda_produccion.setHorizontalAlignment(Element.ALIGN_CENTER);
            subtablaproduccion.addCell(titulo_celda_produccion);

            celda.setPhrase(new Phrase("Prod. Acumulada", new Font(FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
            subtablaproduccion.addCell(celda);
            celda.setPhrase(new Phrase("F.C. Mensual", new Font(FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
            subtablaproduccion.addCell(celda);
            celda.setPhrase(new Phrase("% Resp. Est. Mes", new Font(FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
            subtablaproduccion.addCell(celda);
            celda.setPhrase(new Phrase("% Resp. Est. Año", new Font(FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
            subtablaproduccion.addCell(celda);
            tabla.addCell(subtablaproduccion);

            Phrase t_celda = new Phrase("FACTURACIÓN (€)\n", new Font(FontFamily.TIMES_ROMAN, 10, Font.BOLD));
            t_celda.add(new Phrase("(Precio Medio)", new Font(FontFamily.TIMES_ROMAN, 8, Font.NORMAL)));
            celda.setPhrase(t_celda);
            tabla.addCell(celda);
            celda.setPhrase(new Phrase("% Est. Acum. Mes", new Font(FontFamily.TIMES_ROMAN, 9, Font.BOLD)));
            tabla.addCell(celda);

            // Datos

            for (Parque parque : parques) {
                Periodo _periodo = new Periodo(periodo);
                _periodo.AjustarPeriodoCurvas(Periodo.MEDIDA_TM1);

                RD rd = RDFactory.CargarRD(parque.getReal_decreto());

                int potencia = parque.getTarificadores().get(0).getPotencia_autorizada();

                Lectura lectura = e_dao.TotalProduccionPeriodo(parque.getTarificadores().get(0).getId_tarificador(), _periodo);

                celda.setBackgroundColor(BaseColor.WHITE);
                celda.setHorizontalAlignment(Element.ALIGN_LEFT);
                celda.setPhrase(new Phrase(PString.NombreCortoInstalacion(parque.getNombre()), new Font(FontFamily.TIMES_ROMAN, 10, Font.BOLD)));
                tabla.addCell(celda);
                celda.setHorizontalAlignment(Element.ALIGN_CENTER);
                celda.setPhrase(new Phrase(Numeros.Formateo(potencia), new Font(FontFamily.TIMES_ROMAN, 10, Font.BOLD)));
                tabla.addCell(celda);

                PdfPTable tablavalores = new PdfPTable(4);

                // celda.setBorder(Rectangle.RIGHT);

                // Producción Acumulada
                celda.setPhrase(new Phrase(Numeros.Formateo(lectura.getActiva_exportada()), new Font(FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                tablavalores.addCell(celda);

                // Factor de Capacidad Mensual
                int dia_mes = periodo.getDatoFecha(Periodo.FECHA_FINAL, Periodo.DIA); // Se resta 1 porque siempre es hasta el día anterior
                if (dia_mes == 0) dia_mes = periodo.getDatoFecha(Periodo.FECHA_INICIAL, Periodo.DIAS_MES);
                double f_c = 0;
                if (potencia > 0) f_c = Numeros.Redondeo(lectura.getActiva_exportada() / (potencia * 24 * dia_mes) * 100, 2);
                celda.setPhrase(new Phrase(Numeros.Formateo(f_c) + " %", new Font(FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                tablavalores.addCell(celda);

                // % Estimado del Mes con respecto a la previsión del mes
                double prevision = CargarPrevision(parque.getPrevision(), periodo);
                if (prevision == 0) celda.setPhrase(new Phrase("-", new Font(FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                else {
                    double estimado = Numeros.Redondeo((lectura.getActiva_exportada() / prevision) * 100, 2);
                    if (estimado >= 75) celda.setBackgroundColor(BaseColor.YELLOW);
                    if (estimado >= 100) celda.setBackgroundColor(BaseColor.GREEN);
                    if (estimado < 75) celda.setBackgroundColor(BaseColor.RED);
                    celda.setPhrase(new Phrase(Numeros.Formateo(estimado) + "%", new Font(FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                }
                tablavalores.addCell(celda);
                celda.setBackgroundColor(BaseColor.WHITE);

                // % Estimado del Mes con respecto a la previsión anual
                _periodo.DesdePrimeroAño();
                prevision = CargarPrevisionAño(parque.getPrevision(), periodo.getDatoFecha(Periodo.FECHA_INICIAL, Periodo.AÑO));
                if (prevision == 0) celda.setPhrase(new Phrase("-", new Font(FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                else {
                    Lectura lectura_año = e_dao.TotalProduccionPeriodo(parque.getTarificadores().get(0).getId_tarificador(), _periodo);
                    celda.setPhrase(new Phrase(Numeros.Formateo(Numeros.Redondeo((lectura_año.getActiva_exportada() / prevision) * 100, 2)) + "%",
                            new Font(FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                }
                // celda.setBorder(Rectangle.NO_BORDER);
                tablavalores.addCell(celda);

                tabla.addCell(tablavalores);

                // celda.setBorder(Rectangle.BOX);

                // % FACTURACION (€)
                celda.setHorizontalAlignment(Element.ALIGN_RIGHT);
                celda.setColspan(1);
                double precio_medio = 0;
                if (rd != null) precio_medio = rd.CalculoPrecioMedio(precio_mercado, parque.getComplemento_reactiva());
                // Se divide por 1000 porque son megawatioshora
                String fact = Numeros.Formateo(Numeros.Redondeo(lectura.getActiva_exportada() / 1000 * precio_medio, 0));

                t_celda = new Phrase(fact, new Font(FontFamily.TIMES_ROMAN, 10, Font.BOLD));
                t_celda.add(new Phrase(" - (" + Numeros.Formateo(Numeros.Redondeo(precio_medio, 2)) + " €/MWh)", new Font(FontFamily.TIMES_ROMAN, 8,
                        Font.NORMAL)));
                celda.setPhrase(t_celda);
                tabla.addCell(celda);

                // % Respecto Acumulado estimado mes
                celda.setHorizontalAlignment(Element.ALIGN_CENTER);
                prevision = CargarPrevision(parque.getPrevision(), periodo);
                int dias_mes = periodo.getDatoFecha(Periodo.FECHA_INICIAL, Periodo.DIAS_MES);

                if (prevision == 0) celda.setPhrase(new Phrase("-", new Font(FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                else {
                    double estimado = Numeros.Redondeo(lectura.getActiva_exportada() / (prevision * dia_mes / dias_mes) * 100, 2);
                    if (estimado >= 75) celda.setBackgroundColor(BaseColor.YELLOW);
                    if (estimado >= 100) celda.setBackgroundColor(BaseColor.GREEN);
                    if (estimado < 75) celda.setBackgroundColor(BaseColor.RED);
                    celda.setPhrase(new Phrase(Numeros.Formateo(estimado) + "%", new Font(FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                }
                tabla.addCell(celda);
            }
        } catch (EyraDaoException e) {
            System.out.println(e.getMessage());
        } catch (FormateoFechaException e) {
            System.out.println(e.getMessage());
        }

        return tabla;
    }
}